#ifndef VEC_H
#define VEC_H

#define radians(degress) ((degress) * 0.01745329251994329576923690768489)
#define degrees(radians) ((radians) * 57.295779513082320876798154814105)

 typedef struct {
    union {float x, r, s;};
    union {float y, g, t;};
}vec2;
 typedef struct {
    union {float x, r, s;};
    union {float y, g, t;};
    union {float z, b, p; };
}vec3;
vec2* vec2_set(vec2* out, float x, float y);
vec2* vec2_normalize(vec2* v2);
vec2* vec2_normalize_copy(vec2* out, const vec2* v2);
vec2* vec2_mult_v(vec2* left, float v);
vec2* vec2_mult_v_copy(vec2* out, const vec2* left, float v);
vec2* vec2_mult_v2(vec2* left, const vec2* right);
vec2* vec2_mult_v2_copy(vec2* out, const vec2* left, const vec2* right);
float vec2_dot(const vec2* left, const vec2* right);
vec2* vec2_add(vec2* left, const vec2* right);
vec2* vec2_add_copy(vec2* out, const vec2* left, const vec2* right);
float vec2_length(const vec2* v2);
vec2* vec2_copy(vec2* des, const vec2* src);
// vec2 no cross function

vec3* vec3_normalize(vec3* v);
vec3* vec3_normalize_copy(vec3* out, const vec3* v);
float vec3_length(const vec3* v);
float vec3_dot(const vec3* v1, const vec3* v2);
vec3* vec3_cross(vec3* left, const vec3* right);
vec3* vec3_cross_copy(vec3* out, const vec3* left, const vec3* right);
vec3* vec3_mult_v(vec3* left, float v);
vec3* vec3_mult_v_copy(vec3* out, const vec3* left, float v);
vec3* vec3_mult_v3(vec3* left, const vec3* right);
vec3* vec3_mult_v3_copy(vec3* out, const vec3* left, const vec3* right);
vec3* vec3_add(vec3* left, const vec3* right);
vec3* vec3_add_copy(vec3* out, const vec3* left, const vec3* right);
vec3* vec3_set(vec3* out, float x, float y, float z);
vec3* vec3_copy(vec3* des, const vec3* src);
vec3* vec3_from_v2(vec3* out, const vec2* v2, float z);
#endif
